#pragma once


#include <list>
#include <memory>
#include <stdexcept>

#include "rtda/frame.h" // 引入Frame类

namespace jvm {
namespace rtda {

class Frame; // 前向声明Frame类

class JvmStack {
public:
    JvmStack(size_t max_size) : _max_size(max_size), _size(0), _top(nullptr) {}
    JvmStack(const JvmStack&) = delete; // 禁止拷贝构造
    JvmStack& operator=(const JvmStack&) = delete; // 禁止赋值操作
    JvmStack(JvmStack&&) = default; // 允许移动构造
    JvmStack& operator=(JvmStack&&) = default; // 允许移动赋值
    ~JvmStack() = default;

    void push(std::shared_ptr<Frame> frame);

    std::shared_ptr<Frame> pop();

    std::shared_ptr<Frame> top() const;
private:
    size_t _max_size;
    size_t _size;
    std::shared_ptr<Frame> _top;
    std::list<std::shared_ptr<Frame>> _frames;
};

} // namespace rtda
} // namespace jvm
